package io.geekidea.boot.util.baiwangApi;

import com.baiwang.open.client.BWRestClient;
import com.baiwang.open.client.IBWClient;
import com.baiwang.open.client.login.BopLoginClient;
import com.baiwang.open.client.login.BopLoginResponse;
import com.baiwang.open.client.login.PasswordLoginClient;
import com.baiwang.open.client.login.PasswordLoginConfig;
import com.baiwang.open.entity.request.SOutputinvoiceRetryRequest;
import com.baiwang.open.entity.response.SOutputinvoiceRetryResponse;
import com.baiwang.open.exception.BWOpenException;
import io.geekidea.boot.config.baiwang.BaiwangConfig;
import org.springframework.stereotype.Component;

import java.util.UUID;

/**
 * 重开发票
 */
@Component
public class Retry {
    static String url = BaiwangConfig.getUrl();
    static String appKey = BaiwangConfig.getAppKey();
    static String userName = BaiwangConfig.getUserName();
    static String password = BaiwangConfig.getPassword();
    static String appSecret = BaiwangConfig.getAppSecret();
    static String userSalt = BaiwangConfig.getUserSalt();

    public static SOutputinvoiceRetryResponse retryInvoice(
            String taxNo,
            String serialNo,
            String orderNo,
            String invoiceTerminalCode,
            String isForceRepush
    ) throws BWOpenException {
        try {
            String requestId = UUID.randomUUID().toString(); //自定义请求唯一标识
            PasswordLoginConfig loginConfig = new PasswordLoginConfig();
            loginConfig.setUrl(url);
            loginConfig.setClientId(appKey);
            loginConfig.setClientSecret(appSecret);
            loginConfig.setUsername(userName);
            loginConfig.setPassword(password);
            loginConfig.setUserSalt(userSalt);
            BopLoginClient loginClient = new PasswordLoginClient(loginConfig);

            // 获取token, token相关说明请参考 文档中心 -> 用户授权说明
            BopLoginResponse loginResponse = loginClient.login();
            // 重载方法，可以传自定义请求唯一标识
            // BopLoginResponse loginResponse = loginClient.login(requestId);
            String token = loginResponse.getResponse().getAccessToken();

            SOutputinvoiceRetryRequest request = new SOutputinvoiceRetryRequest();
            request.setTaxNo(taxNo);// 必填：税号（类型：String，长度：20）

            //下面二者其中一个必填
            request.setSerialNo(serialNo);// 非必填：申请流水号（类型：String，长度：20）
            request.setOrderNo(orderNo);// 非必填：开票单号（类型：String，长度：20）

            request.setInvoiceTerminalCode(invoiceTerminalCode);//非必填 开票终端/数电账号
            request.setIsForceRepush(isForceRepush);//强制开票标志:0-否(默认),1-是

            IBWClient client = new BWRestClient(url, appKey, appSecret); // 初始化一个客户端
            //IBWClient client = new BWRestClient(url, appKey, appSecret, loginClient); // 初始化一个客户端,构造函数中传入loginConfig对象参数可针对‘token错误’异常进行重试1次。
            SOutputinvoiceRetryResponse response = client.sOutputinvoice().retry(request, token);
            // 重载方法，可以传自定义请求唯一标识
            // SOutputinvoiceRetryResponse response = client.sOutputinvoice().retry(request, token, requestId);
            System.out.println(response);
            return response;
        } catch (BWOpenException e) {
            throw e;
        }
    }
}